package main

import (
	"fmt"
)

var arr0 [5]int = [5]int{1, 2, 3}
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3, 4, 5, 6}
var str = [5]string{3: "hello world", 4: "tom"}

var arr3 [5][3]int
var arr4 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}

//值拷贝行为会造成性能问题，通常会建议使用 slice，或数组指针。
//值拷贝
func test(x [2]int) [2]int {
    fmt.Printf("x: %p\n", &x)
    x[1] = 1000
    return x
}
//指针操作
func test1(x *[2]int) {
    fmt.Printf("x: %p\n", &x)
    x[1] = 2000
}

func printArr(arr *[5]int) {
    arr[0] = 10
    for i, v := range arr {
        fmt.Println(i, v)
    }
}


func main() {
    a := [3]int{1, 2}           // 未初始化元素值为 0。
    b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度。
    c := [5]int{2: 100, 4: 200} // 使用引号初始化元素。
    d := [...]struct {
        name string
        age  uint8
    }{
        {"user1", 10}, // 可省略元素类型。
        {"user2", 20}, // 别忘了最后一行的逗号。
    }
    fmt.Println(arr0, arr1, arr2, str)
    fmt.Println(a, b, c, d)

    e := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    f := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 纬度不能用 "..."。
    fmt.Println(arr3, arr4)
    fmt.Println(e, f)


    g := [2]int{}
    fmt.Printf("g: %p\n", &g)

    z := test(g)
    fmt.Println(g)
     fmt.Println(z)
    //  内置函数 len 和 cap 都返回数组长度 (元素数量)。
    println(len(z), cap(z)) 

    test1(&z)
    fmt.Println(z)


    var n [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}


    

    for k1, v1 := range n {
        for k2, v2 := range v1 {
            fmt.Printf("(%d,%d)=%d ", k1, k2, v2)
        }
        fmt.Println()
    }


    var arr9 [5]int
    printArr(&arr9)
    fmt.Println(arr9)
    arr10 := [...]int{2, 4, 6, 8, 10}
    printArr(&arr10)
    fmt.Println(arr10)
}